package com.opengate.base.authtoken;

import cn.hutool.core.util.IdUtil;
import com.opengate.base.constants.AppConstants;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description JWT工具类
 * @date 2023/4/26 8:58 PM
 */
public class JwtHelper {

    /**
     * 创建JWT
     *
     * @param claims jwt中的payload
     * @param secret jwt密钥
     * @return jwt
     */
    public static String createToken(Map<String, Object> claims, String secret) {
        if (claims == null || claims.isEmpty()) {
            return StringUtils.EMPTY;
        } else {
            String uuid = IdUtil.fastUUID();
            claims.put("uuid", uuid);
            return Jwts.builder()
                    .setClaims(claims)
                    .signWith(SignatureAlgorithm.HS512, secret)
                    .compact();
        }
    }

    /**
     * 创建JWT
     *
     * @param claims jwt中的payload
     * @return jwt
     */
    public static String createToken(Map<String, Object> claims) {
        if (claims == null || claims.isEmpty()) {
            return StringUtils.EMPTY;
        } else {
            String uuid = IdUtil.fastUUID();
            claims.put("uuid", uuid);
            return Jwts.builder()
                    .setClaims(claims)
                    .signWith(SignatureAlgorithm.HS512, AppConstants.APP_SECRET)
                    .compact();
        }
    }

    /**
     * 验证jwt
     *
     * @param token jwt
     * @param secret jwt密钥
     * @return jwt中的payload
     */
    public static Claims parseToken(String token, String secret) {
        return StringUtils.isBlank(token)
                ? null
                : Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    /**
     * 验证jwt
     *
     * @param token jwt
     * @return jwt中的payload
     */
    public static Claims parseToken(String token) {
        return StringUtils.isBlank(token)
                ? null
                : Jwts.parser()
                        .setSigningKey(AppConstants.APP_SECRET)
                        .parseClaimsJws(token)
                        .getBody();
    }
}
